# utils/logger.py
import os
import sys
from pathlib import Path
from loguru import logger
from typing import Optional, Dict, Any
from datetime import datetime

# 导入全局常量
from utils.constants import DEFAULT_DATETIME_FORMAT, PROJECT_NAME

# ===================== 日志配置 =====================
# 日志存储目录（项目根目录下的logs文件夹）
LOG_DIR = Path(__file__).parent.parent / "logs"
LOG_DIR.mkdir(exist_ok=True)  # 不存在则创建

# 日志文件名（按日期轮转）
LOG_FILE_NAME = f"{PROJECT_NAME.replace(' ', '_').lower()}_{datetime.now().strftime('%Y%m%d')}.log"
LOG_FILE_PATH = LOG_DIR / LOG_FILE_NAME

# 简化控制台输出格式（避免KeyError）
CONSOLE_FORMAT = (
    "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
    "<level>{level: <8}</level> | "
    "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
    "<level>{message}</level>"
)

# 文件输出格式（完整格式）
LOG_FORMAT = (
    "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
    "<level>{level: <8}</level> | "
    "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
    "<level>{message}</level>"
)

# 移除默认的终端输出，重新配置
logger.remove()

# 1. 终端输出配置（简化格式）
logger.add(
    sink=sys.stdout,
    format=CONSOLE_FORMAT,
    level="INFO",
    enqueue=True,  # 支持多线程安全
    backtrace=True,
    diagnose=True
)

# 2. 文件输出配置（完整格式，按大小轮转）
logger.add(
    sink=LOG_FILE_PATH,
    format=LOG_FORMAT,
    level="DEBUG",  # 文件日志保留DEBUG及以上级别
    enqueue=True,
    backtrace=True,
    diagnose=True,
    rotation="500 MB",  # 单个日志文件最大500MB
    retention="7 days",  # 日志保留7天
    compression="zip",  # 过期日志压缩为zip
    encoding="utf-8"
)

# ===================== 日志工具类（方便快速使用） =====================
class Logger:
    """封装loguru，默认填充task_id和agent_name，避免重复传参"""
    @staticmethod
    def get_logger(task_id: Optional[str] = "unknown", agent_name: Optional[str] = "unknown"):
        """获取带默认上下文的logger（task_id/agent_name）"""
        return logger.bind(task_id=task_id, agent_name=agent_name)

    @staticmethod
    def update_context(task_id: str, agent_name: str):
        """更新logger的上下文（比如任务执行中切换task_id）"""
        return logger.bind(task_id=task_id, agent_name=agent_name)

# ===================== 全局logger实例（默认上下文） =====================
# 无明确task_id/agent_name时使用
global_logger = Logger.get_logger()

# ===================== 使用示例 =====================
if __name__ == "__main__":
    # 1. 使用全局logger（默认task_id/agent_name）
    global_logger.info("系统启动成功")
    global_logger.warning("Redis连接超时，正在重试")
    global_logger.error("Nacos配置拉取失败", exc_info=True)  # exc_info=True显示异常栈

    # 2. 使用带自定义上下文的logger（推荐Agent/Task使用）
    task_logger = Logger.get_logger(task_id="task_123456", agent_name="orchestrator_agent")
    task_logger.debug("开始拆解任务")
    task_logger.info("任务分发完成", extra={"target_agents": ["text_qa", "doc_qa"]})  # 额外上下文

    # 3. 更新上下文
    task_logger = Logger.update_context(task_id="task_123456", agent_name="text_qa_agent")
    task_logger.success("文本问答执行成功")